package com.itheima.d0_feedback;

import java.io.*;

/*
1、使用递归方方式拷贝文件夹的详细操作展开说说

2、
    1.Java八股文是什么?
        就是一些JavaSE+DB+JVM+SSM...的面试题（面经，面试宝典）
    2. public int read()   返回的int, 是指的码点吗?
        如果是单字节字符，没错。但是对于多字节来讲就不是，因为这个方法只能读取一个字节数据。
        虽然返回的是int数据，但是只能读取到文件中的一个字节数据。

    3.byte[] bytes1=new byte[Integer.MAX_VALUE];
     System.out.println("bytes1.length = " + bytes1.length);
     这个Integer.MAX_VALUE是啥意思,  为啥打印还会报错
            Integer.MAX_VALUE 表示int的最大值，21亿多
            new byte[Integer.MAX_VALUE] 相当于创建了一个21亿多长度的一个字节数组。
            占用空间很大，内存不够了，报内存溢出错误。

     4.(int)file.length() 这里要强转,获取的长度不是整形吗?
        file.length(): 类型是long类型，而数组的长度需要int类型来指定。


3、缓存与内存之间的数据交换也是通过IO流实现的吗？
   不用，直接操作。缓存就在内存中，一般缓存会使用数组来实现。直接用就可以
   IO流可以实现文件数据在主存和二级存储之间进行传输，也可以实现主存与网络之间数据的传输。


2、try-with-resource自动释放资源是依据什么实现的？如果是调用了close方法，是在哪个流程实现的？
    try-with-resource的自动释放资源能力是语法的价值所在。当该语法块执行完毕，就一定会执行资源的close方法。

向方法传对象时，传递的时地址值，还是复制了一份再传递的。
    形参地址复制了一份地址传给实参。实参和形参的地址是一样的。但是该地址指向的堆内存数据是不变的。

len = fis.read(buf) read方法是如何将字节数据封装进buf内的。

 */
public class Demo1 {
    public static void main(String[] args) {
        File srcFolder = new File("day10io-app2/src");
        File destFolder = new File("day10io-app2/file");
        copyFolder(srcFolder, destFolder);
    }

    /**
     * @param srcFolder  原文件夹
     * @param destFolder 目标文件夹
     */
    public static void copyFolder(File srcFolder, File destFolder) {
        //完成拷贝
        //先遍历源文件夹内容获取所有的子文件
        File[] files = srcFolder.listFiles();

        for (File file : files) {
            if (file.isFile()) {
                //文件
                //使用IO流完成拷贝
                //构建目标文件（目标文件夹/文件名）
                File destFile = new File(destFolder, file.getName());
                //拷贝
                copyFile(file, destFile);
            } else {
                //文件夹
                //创建目标文件夹
                File newFolder = new File(destFolder, file.getName());
                newFolder.mkdirs();//完成文件的创建
                //file -->newFolder
                copyFolder(file, newFolder);
            }
        }


    }

    //文件的拷贝
    public static void copyFile(File src, File dest) {
        try (
                FileInputStream fis = new FileInputStream(src);
                FileOutputStream fos = new FileOutputStream(dest);
        ) {
            //完成拷贝
            int len;
            byte[] buf = new byte[1024];
            while ((len = fis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
            //释放资源（自动完成）

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

class Demo2 {
    public static void main(String[] args) {
       /* MyResource myResource = null;
        try {
            myResource = new MyResource();


            //用完资源后
        } finally {
            if (myResource != null)
                myResource.close();
        }*/

        try (MyResource myResource = new MyResource()) {
            myResource.process();
            //自动释放资源（自动调用close方法）
        }
    }
}

class MyResource implements AutoCloseable {
    public void close() {
        System.out.println("释放资源");
    }

    public void process() {
        System.out.println("处理资源操作！！");
    }
}